package com.easydev.basic.web.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * AOP案例，通过AOP实现日志记录
 * 
 * @author glf
 * @version 1.0
 * @CreateDate 2016年3月4日
 */
@Aspect
public class DemoAspectj {

    private Logger log = LoggerFactory.getLogger(DemoAspectj.class);

    @Before("execution(* com.easydev.basic.web.controller.*.*(..))")
    public void doBefore(JoinPoint joinPoint) {
        log.info("DemoAspectj doBefore执行");
    }

    /**
     * AOP的方式包含@Before、@After、@Around等多种方式</br>
     * 切入点可以是包、注解、参数等，多个切入点表达式使用&&、||、！来组合
     * 
     * @author glf
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(* com.easydev.basic.web.controller.*.*(..))")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // 方法执行前可以干一些事
        log.info("DemoAspectj doAround执行");
        long beginTime = System.nanoTime();

        // 获取拦截方法的参数
        Object[] args = joinPoint.getArgs();
        // 如果是controller方法，并且参数中包含request和response，可以通过这种方法获取这两个实例
        // HttpServletRequest request = (HttpServletRequest) args[0];
        // HttpServletResponse response = (HttpServletResponse) args[1];

        // 执行controller方法
        Object result = joinPoint.proceed();

        // 方法执行后增加一些处理
        long endTime = System.nanoTime();
        log.info(joinPoint.getSignature().getName() + "方法执行了:" + (endTime - beginTime) + "ms");

        return result;
    }

    @After("execution(* com.easydev.basic.web.controller.*.*(..))")
    public void doAfter(JoinPoint joinPoint) {
        log.info("DemoAspectj doAfter执行");
    }

}
